package com.hx.factory.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 */
public class InstanceProxyFactory {
    private Object target;

    public InstanceProxyFactory(Object target){
        this.target = target;
    }

    public Object getProxy(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * 如何代理
                     * @param proxy 代理对象，一般不用
                     * @param method 目标方法
                     * @param args 目标方法的参数
                     * @return 方法执行的返回值
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        try {
                            if(method.getName() != null && method.getName().startsWith("find")) {
                                result = method.invoke(target, args);
                            } else {
                                System.out.println("开启事务----------------");
                                //调用目标方法
                                result = method.invoke(target, args);
                                System.out.println("提交事务----------------");
                            }
                        } catch (Exception e) {
                            //e.printStackTrace();
                            System.out.println("回滚事务----------------");
                        }
                        return result;
                    }
                });
    }
}
